'use strict';

const Service = require('egg').Service;

/**
 * 政采云API服务
 * 处理与政采云平台的所有接口通信
 */
class ZcyAPIService extends Service {
  /**
   * 获取订单列表
   * @param {Object} params - 查询参数
   * @param {number} params.startTime - 开始时间戳
   * @returns {Promise<Array>} 订单列表
   */
  async fetchOrders(params) {
    const { ctx } = this;
    const { startTime } = params;

    // 政采云API基础配置
    const { apiEndpoint } = this.app.config.zcyConfig;

    // 调用政采云订单查询接口
    const result = await ctx.curl(`${apiEndpoint}/order/list`, {
      method: 'GET',
      data: {
        startTime,
        pageSize: 100,
        pageNum: 1
      },
      dataType: 'json',
      timeout: 10000,
      headers: {
        'Authorization': `Bearer ${await this._getAccessToken()}`
      }
    });

    // 错误处理
    if (result.status !== 200 || result.data.code !== 200) {
      ctx.logger.error(`政采云订单同步失败: ${JSON.stringify(result.data)}`);
      ctx.throw(500, `订单同步失败: ${result.data.message || '未知错误'}`);
    }

    return result.data.data;
  }

  /**
   * 获取政采云API访问令牌
   * @returns {Promise<string>} 访问令牌
   */
  async _getAccessToken() {
    const { ctx } = this;
    const cacheKey = 'zcy_api_access_token';

    // 尝试从缓存获取
    const cachedToken = await ctx.app.redis.get(cacheKey);
    if (cachedToken) {
      return cachedToken;
    }

    // 缓存未命中，调用获取令牌接口
    const { appKey, appSecret } = this.app.config.zcyConfig;
    const result = await ctx.curl(`${this.app.config.zcyConfig.apiEndpoint}/auth/token`, {
      method: 'POST',
      data: {
        appKey,
        appSecret,
        grantType: 'client_credentials'
      },
      dataType: 'json',
      timeout: 5000
    });

    if (result.status !== 200 || !result.data.accessToken) {
      ctx.throw(500, `获取政采云访问令牌失败: ${result.data.message || '未知错误'}`);
    }

    // 缓存令牌（设置过期时间，预留60秒缓冲）
    await ctx.app.redis.set(cacheKey, result.data.accessToken, 'EX', result.data.expiresIn - 60);

    return result.data.accessToken;
  }
}

module.exports = ZcyAPIService;